package com.cskaoyan._06oop3._02abstract;

/**
 * @author Macro_Ray
 * @since 2024/3/12 9:50
 */
// 抽象
/*
 * 公司正在开发一套员工管理系统，需要对公司内部存在的员工进行管理程序员负责技术开发。
 * 公司将员工分为三类，普通员工负责杂项工作，经理负责统筹规划
 * 普通员工包含3个属性:姓名、工号以及工资，行为是工作
 * 程序员包含了个属性:姓名、工号以及工资，行为是工作和加班(overtime work)
 * 经理包含4个属性:姓名、工号、工资以及奖金(bonus)，行为是工作*/
public class Demo1 {
    public static void main(String[] args) {
        // 抽象类到底有什么用
        // 任何普通类继承了该抽象类，都必须实现其中的抽象方法
        // 定义一个规范，告诉别人这里有这些方法

        // 思考：实例化？
        /*BaseStaff baseStaff=new BaseStaff() {
            @Override
            public void work() {

            }
        }*/

        BaseStaff normalStaff = new CoderStaff();
        normalStaff.work();

        // 编译看左边，运行看右边
        // 编译时他只知道这个normalStaff是一个BaseStaff类型的，里面并没有加班这个方法，所以要进行强转才可以调用加班
        ((CoderStaff)normalStaff).overtimeWork();
        // normalStaff.overtimeWork();


    }
}
// 抽象类和普通类没有什么区别
// 抽象类中可以定义抽象方法，抽象方法没有方法体
// 抽象类不行实例化
abstract class BaseStaff{
    String name;
    String staffId;
    int salary;

    // 不需要方法体，因为我们不知道如何实现这个方法
    public abstract void work();
}

// 普通员工包含3个属性：姓名，工号以及工资，行为是工作
class NormalStaff extends BaseStaff{

    @Override
    public void work() {
        System.out.println("普通员工负责杂项工作");
    }
}

// 程序员包含了个属性:姓名、工号以及工资，行为是工作和加班(overtime work)
class CoderStaff extends BaseStaff{

    @Override
    public void work() {
        System.out.println("程序员负责开发工作");
    }

    public void overtimeWork(){
        System.out.println("程序员正在加班");
    }
}

// 经理包含4个属性:姓名、工号、工资以及奖金(bonus)，行为是工作
class ManagerStaff extends BaseStaff{

    int bonus;

    @Override
    public void work() {
        System.out.println("经理负责统筹工作");
    }

}
